package com.wjn.basic.java8.map;


import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;

/**
 * map java8的使用
 * forEach()、getOrDefault()、
 */
public class MapDemo {

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>(16);
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");
        map.put(4, "four");
        map.put(5, "five");
        map.put(6, "six");
        map.put(7, null);

//forEach()方法的使用
        // Java7以及之前写法
//        for (Map.Entry<Integer, String> entry : map.entrySet()) {
//            System.out.println(entry.getKey() + "=" + entry.getValue());
//        }

        // java8使用Map.forEach()方法，并使用匿名内部类实现BiConsumer接口
        map.forEach(new BiConsumer<Integer, String>() {
            @Override
            public void accept(Integer integer, String s) {
                System.out.println("key=" + integer + " value=" + s);
            }
        });
        //java8使用lamada表达式
        map.forEach((key,value)->{
            System.out.println("key="+key+"value="+value);
        });


//getOrDefault()方法
        // Java7以及之前做法
        if (map.containsKey(10)) {
            System.out.println(map.get(10));
        } else {
            System.out.println("NoValue");
        }

        // Java8使用Map.getOrDefault()，如果不存在直接返回NoValue
        System.out.println(map.getOrDefault(10, "defaultValue"));

//putIfAbsent()为空才放入

        map.putIfAbsent(7, "为null或无值才会添加");


//remove(5,"five") key，value匹配才会移除
        map.remove(5,"five");
        map.forEach((k,v)-> System.out.println("key="+k+" value="+v));
        map.put(5,"five");

// replace() map中存在key-value的映射才使用newValue替换掉oldValue
        map.replace(5, "five", "newfive");

//replaceAll()
        map.replaceAll(new BiFunction<Integer, String, String>() {
            @Override
            public String apply(Integer integer, String s) {
                return s.toUpperCase();
            }
        });
        map.replaceAll((integer,s)-> s.toUpperCase());

//merge()方法
        map.merge(6, "+", (s, s2) -> s + s2);
        map.forEach((k,v)-> System.out.println("key="+k+" value="+v));

//compute()方法
        System.out.println("compute");
        map.compute(5, (integer, s) -> s == null ? "null" : s + " is not null");
        map.forEach((k, v) -> System.out.println("key=" + k + " value=" + v));

//computeIfAbsent() 计算集合中是否存在，存在直接
        // 实现一个key对应多个值
        Map<Integer, Set<String>> map1 = new HashMap<>(16);
        map1.put(8,new HashSet<>());
        // Java7及以前的实现方式
//        if (map1.containsKey(1)) {
//            map1.get(1).add("one");
//        } else {
//            Set<String> valueSet = new HashSet<>();
//            valueSet.add("one");
//            map1.put(1, valueSet);
//        }

        // Java8的实现方式 即它会判断一下这个key是否存在并且key对应的value是否为空，
        // 如果key存在且key对应的value不为null，则将这个value关联到对应的key上，即在原来的value中新增一个value
        // 如果key不存在，则新增一个key-value映射关系

        //map key值不存在执行
        map1.computeIfAbsent(1, v -> new HashSet<>()).add("oneone");

        //map key值存在才会执行
        map1.computeIfPresent(8, (integer, strings) -> {
            Set<String> set = new HashSet<>();
            set.add("888");
            return set;
        });

// 遍历输出key-value映射
        System.out.println("computeIfAbsent");
        map1.forEach((k, v) -> System.out.println("key=" + k + " value=" + v));




    }





}
